#include <iostream>
#include <cstdio>

#define product(x) (x*x)
#define myprint(x) printf(#x"\t=%d\n", x)

int main(int argc, const char *argv[])
{
    {
        int i = 3, j, k;

        j = product(i++);
        k = product(++i);
        std::cout << "using variable j=" << j << " k=" << k << std::endl;
    }

    {
        int i = 3;

        std::cout << "using argument j=" << product(i++) << " k=" << product(++i) << std::endl;
    }

    {
        int i = 3;
        printf("using printf j=%d\n", product(i++));
        printf("using printf k=%d\n", product(++i));
    }

    {
        //后缀运算
        //(1)j=(5,6,(i++)+(i++)+(i++)): j=9(3+3+3)
        //(2)j=(k++,6,(i++)+(i++)+(i++)): j=9(3+3+3)
        //(3)j=1?(i++)+(i++)+(i++): 0: j=9(3+3+3)
        //(4)j=i?(i++)+(i++)+(i++): 0: j=12(3+4+5)
        //(5)j=k++?(i++)+(i++)+(i++): 0: j=12(3+4+5)

        //前缀运算：
        //(6)j=(5,i,(++i)+(++i)+(++i)): j=18(6+6+6)
        //(7)j=(5,k++,(++i)+(++i)+(++i)): j=15(4+5+6)
        //(8)j=1?(++i)+(++i)+(++i): 0: j=18(6+6+6)
        //(9)j=1?(k++,(+i)+(++i)+++i): 0: j=15(4+5+6)
        //(10)j=k++?(++i)+(++i)+(++i): 0: j=15(4+5+6)

        int i = 3, k = 0, j = 0;

        //后缀运算
        myprint(j = (5, 6, (i++) + (i++) + (i++)));
        i = 3;
        myprint(j = (k++, 6, (i++) + (i++) + (i++)));
        i = 3;
        myprint(j = 1 ? (i++) + (i++) + (i++) : 0);
        i = 3;
        myprint(j = i ? (i++) + (i++) + (i++) : 0);
        i = 3;
        myprint(j = k++ ? (i++) + (i++) + (i++) : 0);
        i = 3;

        //前缀运算
        myprint(j = (5, i, (++i) + (++i) + (++i)));
        i = 3;
        myprint(j = (5, k++, (++i) + (++i) + (++i)));
        i = 3;
        myprint(j = 1 ? (++i) + (++i) + (++i) : 0);
        i = 3;
        myprint(j = 1 ? (k++, (+i) + (++i)++ +i) : 0);
        i = 3;
        myprint(j = k++ ? (++i) + (++i) + (++i) : 0);
        i = 3;
    }

    return 0;
}
